//+------------------------------------------------------------------+
//|                                                         Rect.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| CPoint 结构体：笛卡尔坐标系中的点                                 |
//| 用途：表示图表上的二维坐标点，用于定位控件、图形元素等             |
//+------------------------------------------------------------------+
struct CPoint
  {
   int               x;                   // 水平坐标（X轴值）
   int               y;                   // 垂直坐标（Y轴值）
  };

//+------------------------------------------------------------------+
//| CSize 结构体：区域尺寸                                           |
//| 用途：表示矩形区域的宽度和高度，用于设置控件大小、区域范围等       |
//+------------------------------------------------------------------+
struct CSize
  {
   int               cx;                  // 水平尺寸（宽度）
   int               cy;                  // 垂直尺寸（高度）
  };

//+------------------------------------------------------------------+
//| CRect 结构体：矩形区域                                           |
//| 用途：表示图表上的矩形区域，通过左上角和右下角坐标定义，支持       |
//|       尺寸计算、移动、点包含判断等操作，是控件布局的核心数据结构   |
//+------------------------------------------------------------------+
struct CRect
  {
   int               left;                // 左边界坐标
   int               top;                 // 上边界坐标
   int               right;               // 右边界坐标
   int               bottom;              // 下边界坐标

   //----------------------------------------------------------------
   // 边界点操作：获取/设置左上角、右下角和中心点
   //----------------------------------------------------------------
   /**
    * @brief 获取左上角坐标点
    * @return CPoint - 包含 x=left, y=top 的点结构
    */
   CPoint            LeftTop(void)            const;

   /**
    * @brief 设置左上角坐标
    * @param x [in] 新的左边界坐标
    * @param y [in] 新的上边界坐标
    */
   void              LeftTop(const int x,const int y);

   /**
    * @brief 通过点结构设置左上角坐标
    * @param point [in] 包含新 x 和 y 的 CPoint 结构
    */
   void              LeftTop(const CPoint& point);

   /**
    * @brief 获取右下角坐标点
    * @return CPoint - 包含 x=right, y=bottom 的点结构
    */
   CPoint            RightBottom(void)        const;

   /**
    * @brief 设置右下角坐标
    * @param x [in] 新的右边界坐标
    * @param y [in] 新的下边界坐标
    */
   void              RightBottom(const int x,const int y);

   /**
    * @brief 通过点结构设置右下角坐标
    * @param point [in] 包含新 x 和 y 的 CPoint 结构
    */
   void              RightBottom(const CPoint& point);

   /**
    * @brief 获取矩形中心点坐标
    * @return CPoint - 中心点（x=(left+right)/2, y=(top+bottom)/2）
    */
   CPoint            CenterPoint(void) const;

   //----------------------------------------------------------------
   // 尺寸操作：获取/设置宽度和高度
   //----------------------------------------------------------------
   /**
    * @brief 获取矩形宽度
    * @return int - 宽度值（right - left）
    */
   int               Width(void)              const;

   /**
    * @brief 设置矩形宽度（保持左边界不变，调整右边界）
    * @param w [in] 目标宽度（≥0）
    */
   void              Width(const int w);

   /**
    * @brief 获取矩形高度
    * @return int - 高度值（bottom - top）
    */
   int               Height(void)             const;

   /**
    * @brief 设置矩形高度（保持上边界不变，调整下边界）
    * @param h [in] 目标高度（≥0）
    */
   void              Height(const int h);

   /**
    * @brief 获取矩形尺寸（宽度和高度）
    * @return CSize - 包含 cx=Width(), cy=Height() 的尺寸结构
    */
   CSize             Size(void)               const;

   /**
    * @brief 设置矩形尺寸（保持左上角不变，调整右下角）
    * @param cx [in] 目标宽度
    * @param cy [in] 目标高度
    */
   void              Size(const int cx,const int cy);

   /**
    * @brief 通过尺寸结构设置矩形尺寸
    * @param size [in] 包含目标宽度和高度的 CSize 结构
    */
   void              Size(const CSize& size);

   //----------------------------------------------------------------
   // 边界设置：通过多种方式定义矩形区域
   //----------------------------------------------------------------
   /**
    * @brief 通过四个边界值设置矩形
    * @param l [in] 左边界
    * @param t [in] 上边界
    * @param r [in] 右边界
    * @param b [in] 下边界
    */
   void              SetBound(const int l,const int t,const int r,const int b);

   /**
    * @brief 通过另一个矩形设置当前矩形边界
    * @param rect [in] 源矩形（复制其 left/top/right/bottom）
    */
   void              SetBound(const CRect& rect);

   /**
    * @brief 通过左上角点和尺寸设置矩形
    * @param point [in] 左上角点
    * @param size [in] 矩形尺寸（宽度和高度）
    */
   void              SetBound(const CPoint& point,const CSize& size);

   /**
    * @brief 通过左上角点和右下角点设置矩形
    * @param left_top [in] 左上角点
    * @param right_bottom [in] 右下角点
    */
   void              SetBound(const CPoint& left_top,const CPoint& right_bottom);

   //----------------------------------------------------------------
   // 移动操作：绝对移动（到指定位置）
   //----------------------------------------------------------------
   /**
    * @brief 将矩形移动到指定坐标（保持尺寸不变）
    * @param x [in] 新的左边界 x 坐标
    * @param y [in] 新的上边界 y 坐标
    */
   void              Move(const int x,const int y);

   /**
    * @brief 将矩形移动到指定点（左上角对齐该点，保持尺寸不变）
    * @param point [in] 目标左上角点
    */
   void              Move(const CPoint& point);

   //----------------------------------------------------------------
   // 偏移操作：相对移动（从当前位置偏移）
   //----------------------------------------------------------------
   /**
    * @brief 按偏移量移动矩形（保持尺寸不变）
    * @param dx [in] 水平偏移量（正数向右，负数向左）
    * @param dy [in] 垂直偏移量（正数向下，负数向上）
    */
   void              Shift(const int dx,const int dy);

   /**
    * @brief 按点的坐标偏移矩形
    * @param point [in] 偏移量（x 分量为水平偏移，y 分量为垂直偏移）
    */
   void              Shift(const CPoint& point);

   /**
    * @brief 按尺寸的分量偏移矩形
    * @param size [in] 偏移量（cx 为水平偏移，cy 为垂直偏移）
    */
   void              Shift(const CSize& size);

   //----------------------------------------------------------------
   // 包含判断：检查点是否在矩形内
   //----------------------------------------------------------------
   /**
    * @brief 检查指定坐标点是否在矩形内（包含边界）
    * @param x [in] 点的 x 坐标
    * @param y [in] 点的 y 坐标
    * @return bool - 包含结果：true=点在矩形内，false=点在矩形外
    */
   bool              Contains(const int x,const int y) const;

   /**
    * @brief 检查点结构是否在矩形内（包含边界）
    * @param point [in] 待检查的点
    * @return bool - 包含结果：true=点在矩形内，false=点在矩形外
    */
   bool              Contains(const CPoint& point) const;

   //----------------------------------------------------------------
   // 标准化：确保边界值有效（左≤右，上≤下）
   //----------------------------------------------------------------
   /**
    * @brief 标准化矩形边界（交换无效的边界值）
    * @details 若 left > right 则交换两者，若 top > bottom 则交换两者，
    *          确保 Width() 和 Height() 返回非负值
    */
   void              Normalize(void);
  };
//+------------------------------------------------------------------+